<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>时间日期格式转换</title>
  <!-- 
    replace(regexp/substr,replacement): 的方法使用
      replacement	必需。一个字符串值。规定了替换文本或生成替换文本的函数
   -->
</head>

<body>

</body>
<script>
  "use strict";
  const format = (e) => {
    // let now = new Date(1533472686000);  将时间戳转换成date类型之后再操作，否则会报错
    const date = new Date();
    const year = date.getFullYear();
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const hour = date.getHours();
    const minute = date.getMinutes();
    const second = date.getSeconds();
    let str = "";
    if (hour < 11) {
      str = "上午";
    } else if (hour > 13) {
      str = "下午";
    } else {
      str = "中午";
    };

    const week = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"][date.getDay()];
    return `${year}年${month}月${day}日 ${week} ${str} ${hour} ${minute}`;
  };
  let i = format();
  console.log(i);
</script>
<script>
  "use strict"; {
    const date = new Date();
    const year = date.getFullYear();
    const month = date.getMonth() + 1;

    // 快捷获取当前时间的方法
    // new Date(value * 1000).toLocaleString();

    // 获取本月最后一天
    const last_day = new Date(year, month, 0).getDate();
    // 获取今年最后一天
    const year_last_day = new Date(year, 12, 0).getDate();
    //  获取今天的日期
    const jintianriqi = new Date().toLocaleDateString();
    // 获取今日00:00:00时间 输出 Date 对象
    let today = new Date(new Date(new Date().toLocaleDateString()).getTime());
    // 获取今日23:59:59时间 输出 Date 对象
    let i = new Date(new Date(new Date().toLocaleDateString()).getTime() + (24 * 60 * 60 * 1000 - 1));
    // 获取本月1号00:00:00时间 输出 Date 对象
    let j = new Date(new Date(`${year}/${month}/1`).getTime());
    // 获取本月最后一天23:59:59时间 输出 Date 对象
    let k = new Date(new Date(`${year}/${month}/${last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1));
    // 获取今年1月1日00:00:00时间 输出 Date 对象
    let n = new Date(new Date(`${year}/1/1`).getTime());
    // 获取今年最后一天23:59:59时间 输出 Date 对象
    let m = new Date(new Date(`${year}/12/${year_last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1));
    //获取本月第一天是星期几
    // Date.parse是获取某天的毫秒数
    let p = new Date(Date.parse(`${year}/${month}/1`)).getDay();
    /* 
      小例子了
      function getWeekByDay(dayValue){ //dayValue=“2014-01-01”
          var day = new Date(Date.parse(dayValue.replace(/-/g, '/'))); //将日期值格式化
          var today = new Array("星期日","星期一","星期二","星期三","星期四","星期五","星期六"); //创建星期数组
          console.log(today[day.getDay()])
          return today[day.getDay()];  //返一个星期中的某一天，其中0为星期日
      }
    */
  };
</script>
<script>
  "use strict"; {
    const get_last_month_time = (current_time) => {
      //没有传入时间，则使用当前的时间
      const date = current_time ? new Date(current_time) : new Date();
      let year = date.getFullYear(); //获取年份
      let month = date.getMonth(); //获取月份
      let last_day = new Date(year, month, 0).getDate(); // 获取本月最后一天(这个月共有多少天)
      let start_time = 0; //本月开始的时间
      let end_time = 0; //本月结束的时间
      if (month) { //当月份大于0时，即为本年的月份
        start_time = +new Date(`${year}/${month}/1`);
        end_time = new Date(`${year}/${month}/${last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1);
      } else { //计算上一年的12月份
        year -= 1;
        month = 12; //上一年最后一个月份
        last_day = new Date(year, month, 0).getDate(); // 某年最后一个月份的天数
        start_time = +new Date(`${year}/${month}/1`);
        end_time = new Date(`${year}/${month}/${last_day}`).getTime() + (24 * 60 * 60 * 1000 - 1);
      };
      return {
        start: start_time,
        end: end_time,
      };
    };
    let { start, end } = get_last_month_time();
    console.log(start);
    console.log(end);
  };
</script>
<script>
  "use strict"; {
    // formats格式包括
    // 1. Y-m-d
    // 2. Y-m-d H:i:s
    // 3. Y年m月d日
    // 4. Y年m月d日 H时i分
    const dateFormat = (timestamp, formats = "Y-m-d H") => {
      const DATE = timestamp ? new Date(timestamp) : new Date();
      let year = DATE.getFullYear();
      let month = (DATE.getMonth() + 1).toString().padStart(2, "0");
      let day = DATE.getDate().toString().padStart(2, "0");
      let hour = DATE.getHours().toString().padStart(2, "0");
      let minite = DATE.getMinutes().toString().padStart(2, "0");
      let second = DATE.getSeconds().toString().padStart(2, "0");
      let week = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"][DATE.getDay()];
      console.log("formats ==", formats)
      return formats.replace(/Y|m|d|H|i|s/ig, res => {
        console.log("res", res)
        return {
          "Y": year,
          "m": month,
          "d": day,
          "H": hour,
          "i": minite,
          "s": second,
          "w": week
        }[res];

      });
    };

    console.log("dateFormat", dateFormat())
  }; {
    // 仿微信的日期时间格式
    let timeFormat = currentTime => {
      const DATE = new Date();
      let Y = DATE.getFullYear();// 获取年
      let M = DATE.getMonth() + 1;// 获取月
      let D = DATE.getDate();// 获取日
      let W = DATE.getDay() ? DATE.getDay() : 7; //获取星期几

      const CURRENT = new Date(currentTime);
      let currentY = CURRENT.getFullYear();
      let currentM = CURRENT.getMonth() + 1;
      let currentD = CURRENT.getDate();
      // 获取今日的毫秒
      let today = +new Date(`${Y}/${M}/${D}`);
      // 获取昨天的毫秒
      let yesterday = +new Date(`${Y}/${M}/${D - 1}`);
      // 获取这周的星期一的毫秒
      let monday = +new Date(`${Y}/${M}/${D - W + 1}`);
      // 获取今年第一天的毫秒
      let yearFirstDay = +new Date(`${Y}/1/1`);
      if (currentTime >= today) { //小于一天的时间
        return `${H < 11 ? "上午" : H > 13 ? "上午" : "中午"}${H}:${I}`;
      } else if (currentTime >= yesterday) {
        return `昨天`;
      } else if (currentTime >= monday) {
        return `周${new Date(currentTime).getDay()}`;
      } else if (currentTime >= yearFirstDay) {
        return `${currentM}月${currentD}日`;
      } else {
        return `${currentY}年${currentM}月${currentD}日`
      };
    };
    console.log(timeFormat(1577808000000));
  };
</script>
<script>
  /*
  ** 时间戳显示为多少分钟前，多少天前的处理
  ** console.log(dateDiff(1411111111111)); // 2014年09月19日
  ** console.log(dateDiff(1481111111111)); // 9月前
  ** console.log(dateDiff(1499911111111)); // 2月前
  ** console.log(dateDiff(1503211111111)); // 3周前
  ** console.log(dateDiff(1505283100802)); // 1分钟前
  */
  "use strict"; {
    let dateDiff = timestamp => {
      // 通过padEnd补全为13位
      timestamp = Number(timestamp.toString().padEnd(13, 0))
      // 获取输入时间戳的对象
      const DATE = new Date(timestamp)

      // 声明分钟、小时、天、半个月、一个月、当前时间的毫秒数、当前时间减传入时间的毫秒值
      let minute = 1000 * 60, hour = minute * 60, day = hour * 24,
        halfamonth = day * 15, month = day * 30, now = +new Date(),
        diffValue = now - timestamp

      // 如果本地时间反而小于变量时间
      if (diffValue < 0) return "不久前"

      // 计算差异时间的量级
      let monthC = diffValue / month, weekC = diffValue / (7 * day), dayC = diffValue / day, hourC = diffValue / hour, minC = diffValue / minute

      // 超过1年，直接显示年月日
      if (monthC > 12) return `${DATE.getFullYear()}年${(DATE.getMonth() + 1).toString().padStart(2, 0)}月${DATE.getDate().toString().padStart(2, 0)}日`
      // 超过一个月
      if (monthC >= 1) return `${parseInt(monthC)}月前`
      // 超过一周
      if (weekC >= 1) return `${parseInt(weekC)}周前`
      // 大于一天，小于一周
      if (dayC >= 1) return `${parseInt(dayC)}天前`
      // 小于一天，超过一小时
      if (hourC >= 1) return `${parseInt(hourC)}小时前`
      // 小于一小时，超过一分钟
      if (minC >= 1) return `${parseInt(minC)}分钟前`
      return "刚刚"
    }
    console.log("看看哈哈")
    let i = dateDiff(1642234461000)
    console.log(i)
    console.log("看看哈哈")
  }
</script>

</html>